#include <stdio.h>
#include <stdlib.h>
int a;
static int b;
char ch; // 没有初始化
int c = 10;
char s1[] = "OKwe";
char c1 = 'w';            // 初始化
const int i = 25;         // 全局常量
char *p = "We are here!"; // 全局常量
r1 = 5;                   // 外部变量赋值
r2 = 7;                   // 外部变量赋值

void test(int r1) // 函数test
{
    printf("test函数内:\t&r1=%#p\t&r2=%#p\n", &r1, &r2);
    printf("test函数内:\t%d*%d=%d\n", r1, r2, r1 * r2);
}

// 指针常量p的&p被分配在全局区，
// 指针pc的&pc被分配在栈区。
int main()
{
    int num = 0;
    const int n = 25;
    volatile int result = 15;
    static int m = 15;
    int *p1, *p2;
    char *pc = "She is here!"; // 局部字符串常量
    char st[] = "We are here!";
    extern int r1, r2;       // 声明外部变量
    p2 = (int *)malloc(100); // 分配堆
    p1 = &num;
    printf("全局没初始化:\t%p %p %p\n", &a, &b, &ch);
    printf("全局初始化:\t%p %p %p\n", &c, &c1, &s1);
    printf("全局常量:\t%p %p\n", &i, &p);
    printf("局部常量:\t%p %p %p %p\n", &n, pc, p2, &m);
    printf("局部变量:\t%p %p %p %p %p %p\n", &num, &result, p1, &pc, &p1, &p2);
    printf("两种常量:\t%p %p %p %p\n", p, &p, pc, &pc);
    printf("局部字串:\t%p %p %p %p\n", st, &st, pc, &pc);
    printf("函数地址:\t%p %p\n", &main, &test);
    printf("主函数内:\t&r1=%#p\t&r2=%#p\n", &r1, &r2);
    test(r1);
    system("pause");
    return 0;
    /*
    全局区（静态区）是存放全局变量和静态变量的存放区域，
    分为已初始化和未初始化两个区域，
        初始化的全局变量和静态变量在一块区域，
        未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
    全局没初始化:   00407074 00407020 00407078
    全局初始化:     00404004 0040400D 00404008
    全局常量:       00405064 00404010
    
    堆（heap）区一般由程序员分配和释放。
    栈区由编译器自动分配和释放，存放函数的参数、局部变量等。

    局部常量:       0061FF18 004050B1 009D4728 0040401C
    局部变量:       0061FF1C 0061FF14 0061FF1C 0061FF08 0061FF10 0061FF0C
    两种常量:       00405068 00404010 004050B1 0061FF08
    局部字串:       0061FEFB 0061FEFB 004050B1 0061FF08
    函数地址:       004014B2 00401460
    主函数内:       &r1=0X00404014  &r2=0X00404018
    test函数内:     &r1=0X0061FED0  &r2=0X00404018
    test函数内:     5*7=35
    */
}

/*
变量的存储地址分配

可以将存储区分为:
    代码区
    文字常量区
    全局区（静态区）
    堆
    栈


代码区用来存放程序的二进制代码，由系统负责。
文字常量区存放字符串常量。
    不管是全局字符串常量，还是局部字符串常量，都由系统分配在文字常量区，这个区位于全局区
    局部字符串常量只是存储在文字常量区，并不像全局字符串那样可以共享。
*/
